// src/api/index.js
import axios from 'axios'
// 引入qs模块，用来序列化post类型的数据
import qs from 'qs'
import utils from '@/utils/index';
import envConfig from '@/config/env';
let apiUrl = envConfig.baseUrl;
import { Notification } from 'element-ui';

const service = axios.create({
    // 设置超时时间
    timeout: 60000,
    baseURL: apiUrl
})

/**
 * 请求前拦截
 * 用于处理需要在请求前的操作
 */
service.interceptors.request.use(config => {
    const token = utils.handleLocalStorage.get('authorized_key');
    config.headers['authorizedkey'] = token;
    if (config.data && config.data.useJson) {
        delete config.data.useJson;
        config.data =  qs.stringify(config.data)
    }
    //config.data = qs.stringify(config.data);
    return config;
}, (error) => {
    return Promise.reject(error);
});
/**
 * 请求响应拦截
 * 用于处理需要在请求返回后的操作
 */
service.interceptors.response.use(response => {
    const responseCode = response.status
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
    if (responseCode !== 0) {
        let resDataCode = response.data.code;
        switch (resDataCode) {
            case 401:
                localStorage.removeItem('authorized_key');
                window.location.replace('/login');
                break;
            default:
                break;
        }
        return Promise.resolve(response)
    } else {
        console.log(500);
        return Promise.reject(response)
    }
}, error => {
    // 断网 或者 请求超时 状态
    if (!error.response) {
        Notification({
            type: 'error',
            title: '错误',
            message: '服务器开小差了'
        });
        // 请求超时状态
        if (error.message.includes('timeout')) {

        } else {
            // 可以展示断网组件
        }
        return;
    }
    // 服务器返回不是 2 开头的情况，会进入这个回调
    // 可以根据后端返回的状态码进行不同的操作
    const responseCode = error.response.status;
    //error.response.data.message
    const codeSlotArr = {
        '401': () => {


        },
        '403': () => {
            // 弹出错误信息

            // 清除token
            localStorage.removeItem('authorized_key');
                // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
        },
        '500': () => {
            alert('服务器开小差了');
        },
        // 404请求不存在
        '404': () => {

        },
        'default': () => {

        }
    };
    codeSlotArr[responseCode] ? codeSlotArr[responseCode]() : codeSlotArr['default']();
    return Promise.reject(error)
})

// post请求的时候，我们需要加上一个请求头，所以可以在这里进行一个默认的设置
// 即设置post的请求头为application/x-www-form-urlencoded;charset=UTF-8
service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

const request = {
    get: (resUrl, resPar, config = {}) => {
        return service.get(resUrl, Object.assign({params: resPar},config));
    },
    post: (resUrl, resPar) => {
        return service.post(resUrl, resPar);
    },
    put: (resUrl, resPar) => {
        return service.put(resUrl, resPar);
    }
}

export default request;
